package cn.tk.model.pojo.mr.engine;

import cn.tk.model.pojo.mr.flow.ContextPair;
import cn.tk.model.pojo.mr.flow.ReplyDTO;
import cn.tk.model.pojo.mr.nlu.NluResp;
import cn.tk.utils.EmptyUtil;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * Created by denglw on 2021/7/29.<br/>
 * Desc: 多轮会话控制对象
 */
@Data @NoArgsConstructor
public class MrSession {

    /**
     * 用户id
     */
    private String userId;

    /**
     * 会话id
     */
    private String sessionId;

    /**
     * 交互轮次列表
     */
    private List<Round> rounds;

    @Data @NoArgsConstructor
    public static class Round {
        /**
         * 消息id
         */
        private String messageId;

        /**
         * 用户消息
         */
        private String msg;

        /**
         * nlu模型结果
         */
        private NluResp nlu;

        /**
         * 流程id
         */
        private Long flowId;

        /**
         * 流经的节点串
         */
        private List<Long> nodeIds;

        /**
         * 是否触发短信
         */
        private Boolean smsSend;

        /**
         * 采集的信息列表: 编码 +  具体值
         * 意向标签  intentLabel
         * 问题件标识 questionFlag
         * 答案号  answerNo
         * 答案内容  answerContent
         * 问题号  questionNo
         * 问题内容  questionContent
         */
        private Map<String, String> collects;

        /**
         * 上下文
         */
        private List<ContextPair> contextPairs;

        /**
         * 实体澄清结果
         */
        private ClarifyResult clarifyResult;

        /**
         * 回复正文
         */
        private List<ReplyDTO> customReplies;

        /**
         * 不响应问题集
         */
        private List<String> filterQuestions;

        /**
         * 次序号：从1开始
         */
        private Integer serialNo;

        public Round(String messageId) {
            this.messageId = messageId;
        }

        public void appendNodeId(Long nodeId) {
            if (EmptyUtil.nullOrZero(nodeId)) {
                return;
            }
            if (this.nodeIds == null) {
                this.nodeIds = new ArrayList<>();
            }
            nodeIds.add(nodeId);
        }

        public void appendContextPair(ContextPair pair) {
            if (pair == null) {
                return;
            }
            if (contextPairs == null) {
                contextPairs = new ArrayList<>();
            }
            contextPairs.add(pair);
        }

        /**
         * 获取当前轮次的最近一个节点.<br/>
         * @param currNodeId 当前节点，如果为空，则返回缓存中最末节点
         * @return 最近一个节点
         */
        public Long getLastNodeId(Long currNodeId) {
            if (EmptyUtil.emptyColl(this.nodeIds)) {
                return 0L;
            }
            int size = nodeIds.size();
            Long endNodeId = this.nodeIds.get(size - 1);
            if (EmptyUtil.nullOrZero(currNodeId)) {
                return endNodeId;
            }
            if (!Objects.equals(endNodeId, currNodeId)) {
                return endNodeId;
            }
            return size > 1 ? nodeIds.get(size - 2) : 0L;
        }
    }

}
